package com.white.mybatis.dynamic;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 增删改查接口
 * </p>
 *
 * @author huangzy
 * @since 2022/2/22
 */
public interface IDynamicMapper extends Mapper<Map<String,Object>> {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(Map<String,Object> entity);

    /**
     * 根据 wrapper 条件，删除记录
     *
     * @param wrapper 封装操作类（可以为 null）
     */
    int delete(QueryWrapper<?> wrapper);

    /**
     * 根据 whereEntity 条件，更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类（可以为 null,里面的 entity 用于生成 where 语句）
     */
    int update(Map<String,Object> entity, QueryWrapper<?> updateWrapper);

    /**
     * 根据 wrapper 条件，查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     * @param throwEx      有多个 result 是否抛出异常
     */
    Map<String,Object> selectOne(QueryWrapper<?> queryWrapper, boolean throwEx);

    /**
     * 根据 wrapper 条件，查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
    default Map<String,Object> selectOne(QueryWrapper<?> queryWrapper){
        return selectOne(queryWrapper,true);
    }

    /**
     * 根据 Wrapper 条件，查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
    long selectCount(QueryWrapper<?> queryWrapper);

    /**
     * 根据 wrapper 条件，查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
    List<Map<String,Object>> selectList(QueryWrapper<?> queryWrapper);

    /**
     * 根据 wrapper 条件，查询全部记录（并翻页）
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类（可以为 null）
     */
    Page<Map<String,Object>> selectPage(Page<?> page, QueryWrapper<?> queryWrapper);

}
